package com.fingard.dsp.bank.directbank.zjdsf01.util;

import com.sun.jna.Library;
import com.sun.jna.Memory;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.ByteByReference;

/**
 * MAC消息鉴别码生成工具类
 * 
 * 工具类使用说明:
 * 一、原始C语言编写dll函数定义:int LMac_Ascii( void *pMAC_Sour, int nMAC_SourLen, void *pMAC, int nMAC_Idx);
 *		     参数说明:
 *	      pMAC_Sour          要进行运算的数据源
 *	      nMAC_SourLen       数据源长度
 *	      pMAC               存放输出结果的缓冲区，缓冲区大小为18字节，目前的输出结果为8个字节的字符序列，以后可能有变化
 *	      nMAC_Idx           使用的索引号，推荐用2
 *	      LMac_Ascii函数返回0代表成功，其它值表示失败。
 *	      0   --  成功
 *	      1   --  设备模块尚未成功打开
 *	      4   --  设备模块发生未知错误
 *	      -2511   --  服务程序未启动
 *	      -2501   --  服务程序未启动
 *	      -2551   --  请求服务出错
 *	      -2531   --  返回服务出错
 *	      -2361   --  索引号不存在
 *	      -2363   --  MAC运算内容太长（最长为1024）
 *	      -2301   --  设备模块尚未成功打开
 *	      -2304   --  设备模块发生未知错误
 * 
 * @author Cruise
 * @date 2019/6/20
 */
public class WMACREQ {
	public interface WmacReqDll extends Library {
		/**
		 * MAC消息鉴别码dll加载
		 */
		WmacReqDll wmacReq = (WmacReqDll) Native.loadLibrary("WMACREQ",	WmacReqDll.class);
	      
		/**
		 * MAC消息校验码生成
		 * 
		 * @param macSource
		 *            要进行运算的数据源
		 * @param macSourceLen
		 *            数据源长度
		 * @param macResult
		 *            存放输出结果的缓冲区，缓冲区大小为18字节，目前的输出结果为8个字节的字符序列，以后可能有变化
		 * @param macIndex
		 *            使用的索引号，推荐用2
		 * @return MAC结果引用
		 */
		public int LMac_Ascii(Pointer macSource, int macSourceLen, ByteByReference macResult, int macIndex);
	}

	public static String generateMac(String macResource, String charset) throws Exception {
        Pointer p = new Memory(512L);
        p.setString(0, macResource, charset);
        ByteByReference macResult = new ByteByReference();
        macResult.setPointer(new Memory(512));
        WmacReqDll.wmacReq.LMac_Ascii(p, macResource.getBytes(charset).length, macResult, 2);
        return macResult.getPointer().getString(0).substring(0,8).trim();
	}
}